问题:N皇后问题是在N*N的棋盘上要摆N个皇后,要求任意两个皇后不同行、不同列,也不在同一斜线上。给定一个整数n,返回n皇后的摆法有多少种。
例:n<1,返回0.
n=1,返回1.
n=2或3,2皇后和3皇后无论怎么摆都不行,返回0.
n=8,返回92.(经典八皇后问题)
分析:如果在weizhi(i,j)放置了一个皇后,接下来在哪些位置不能放皇后呢?
- 整个第i行不能放;
- 整个第j列不能放;
- 同一斜线位置(a,b)上不能放,即|a-i|==|b-j|。
实现:
- 把逐行放置皇后设置成递归问题,避开条件1中的位置。
- 用一个数组record保存已经放置皇后的位置,record[i]表示第i行皇后所在的列。
- 在递归计算到第i行第j列时,查看record0,…k的值(0,..k行,record[0,..k]列),
1)若有record[k]==j,则(i,j)位置不能放置;(在同一列了)
2)若|k-i|==|record[k]-j|,则(i,j)位置也不能放置。(在同一行了)
1 | public class NQueen { |